// ==UserScript==
// @name         教育平台课件下载
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  国家中小学智慧教育平台课件下载
// @author       jialesmile
// @match        https://basic.smartedu.cn/tchMaterial/detail?contentType=assets_document**
// @icon         
// @updateURL    https://gitee.com/tangjiale/tampermonkey/raw/master/smartedu/smartedu_dowanload_pdf.js
// @downloadURL  https://gitee.com/tangjiale/tampermonkey/raw/master/smartedu/smartedu_dowanload_pdf.js
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 启动脚本，添加下载按钮
    addDownloadButton()

    // 添加下载按钮
    function addDownloadButton() {
        const searchButton = document.querySelector('.toolBar-module_wrapper_NU9GV.index-module_header-to-teach_UwmQo.imageList-module_to-teach-warp_AJHD7');

        if (searchButton) {
            // 创建最外层的 div
            const outerDiv = document.createElement('div');
            outerDiv.classList.add('toolBar-module_wrapper_NU9GV', 'index-module_header-to-teach_UwmQo', 'imageList-module_to-teach-warp_AJHD7');
            outerDiv.style.marginRight = '130px';

            // 创建中间层的 div
            const middleDiv = document.createElement('div');
            middleDiv.classList.add('index-module_to-teach_sxbbq', 'toTeach-module_play-warpper_dL5cW');
            middleDiv.style.paddingRight = '18px';
            middleDiv.style.backgroundColor = 'red';

            // 创建内层的 div
            const innerDiv = document.createElement('div');
            innerDiv.style.backgroundColor = 'red';

            // 创建 span 元素并添加文本
            const span = document.createElement('span');
            span.textContent = '下载课件';

            // 将 span 元素添加到内层 div 中
            innerDiv.appendChild(span);

            // 将内层 div 添加到中间层 div 中
            middleDiv.appendChild(innerDiv);

            // 将中间层 div 添加到最外层 div 中
            outerDiv.appendChild(middleDiv);

            // 绑定下载事件
            outerDiv.onclick = downloadFile;

            // 在 searchButton 元素之前插入最外层 div
            searchButton.parentNode.insertBefore(outerDiv, searchButton);
        } else {
            // 如果没有找到搜索按钮，继续检查
            setTimeout(addDownloadButton, 100); // 每100毫秒检查一次
        }
    }

    /**
     * 获取资源下载链接（优化版）
     * @returns {Promise<string>} 下载链接的Promise对象
     */
    function getDownloadUrl() {
        return new Promise((resolve, reject) => {
            // 从当前URL中提取contentId
            const url = window.location.href;
            const contentIdMatch = url.match(/contentId=([^&]+)/);

            if (!contentIdMatch || !contentIdMatch[1]) {
                reject(new Error('无法从当前URL中提取contentId'));
                return;
            }

            const contentId = contentIdMatch[1];
            const apiUrl = `https://s-file-1.ykt.cbern.com.cn/zxx/ndrv2/resources/tch_material/details/${contentId}.json`;

            // 发送GET请求获取资源信息
            const xhr = new XMLHttpRequest();
            xhr.open('GET', apiUrl, true);

            xhr.onload = function() {
                if (this.status >= 200 && this.status < 300) {
                    try {
                        const responseData = JSON.parse(this.responseText);

                        // 重点优化：直接定位ti_items数组中的有效对象
                        const tiItems = responseData.ti_items || [];
                        const targetItem = tiItems.find(item =>
                                                        item.ti_storages && item.ti_storages.length > 0 && item.ti_format === 'pdf'
                                                       );

                        if (targetItem) {
                            // 提取ti_storages数组的第一条数据（索引0）
                            const downloadUrl = targetItem.ti_storages[0];
                            resolve(downloadUrl);
                        } else {
                            reject(new Error('在ti_items中未找到包含ti_storages的对象'));
                        }
                    } catch (e) {
                        reject(new Error(`解析响应数据失败: ${e.message}`));
                    }
                } else {
                    reject(new Error(`请求失败: 状态码 ${this.status}`));
                }
            };

            xhr.onerror = function() {
                reject(new Error('网络请求错误'));
            };

            xhr.send();
        });
    }

    /**
     * 从本地存储中获取accessToken
     * @returns {string|null} 成功返回accessToken，失败返回null
     */
    function getAccessToken() {
        try {
            // 1. 从本地存储获取X-EDU-WEB-USER数据
            const userKey = "X-EDU-WEB-USER";
            const userData = localStorage.getItem(userKey);

            if (!userData) {
                console.error("本地存储中未找到X-EDU-WEB-USER数据");
                return null;
            }

            // 2. 解析用户数据，提取SDP-APP-ID
            const userInfo = JSON.parse(userData);
            const avatar = userInfo.avatar || "";

            if (!avatar) {
                console.error("用户数据中缺少avatar字段");
                return null;
            }

            // 3. 从avatar URL中提取SDP-APP-ID
            const sdpAppIdMatch = avatar.match(/SDP-APP-ID=([^&]+)/);
            if (!sdpAppIdMatch || !sdpAppIdMatch[1]) {
                console.error("无法从avatar中提取SDP-APP-ID");
                return null;
            }

            const sdpAppId = sdpAppIdMatch[1];
            console.log("提取到SDP-APP-ID:", sdpAppId);

            // 4. 构建完整的storageKey
            const storageKey = `ND_UC_AUTH-${sdpAppId}&ncet-xedu&token`;
            console.log("使用storageKey:", storageKey);

            // 5. 从本地存储获取token数据
            const storageData = localStorage.getItem(storageKey);

            if (!storageData) {
                console.error("本地存储中未找到token相关数据");
                return null;
            }

            // 6. 解析token数据
            const parsedData = JSON.parse(storageData);
            if (!parsedData.value) {
                console.error("token数据格式错误，缺少value字段");
                return null;
            }

            const tokenData = JSON.parse(parsedData.value);
            if (!tokenData.access_token) {
                console.error("token数据格式错误，缺少access_token字段");
                return null;
            }

            return tokenData.access_token;
        } catch (error) {
            console.error("获取accessToken过程出错", error);
            return null;
        }
    }

    // 下载文件函数（修复版）
    async function downloadFile() {
        // 显示遮罩层并获取其引用
        const overlay = showLoadingOverlay();
        try {
            // 等待获取下载URL
            const downloadUrl = await getDownloadUrl();
            // 获取accessToken
            const accessToken = getAccessToken();
            console.log('获取到下载链接:', downloadUrl);

            // 使用获取到的URL发起下载请求
            const response = await fetch(downloadUrl +"?accessToken=" +accessToken, {
                method: 'GET',
                // headers: headers,
                //credentials: 'include' // 确保发送cookie
            });

            if (!response.ok) {
                throw new Error(`下载失败: HTTP状态码 ${response.status}`);
            }

            // 获取文件名（从响应头或URL中提取）
            const contentDisposition = response.headers.get('content-disposition');
            let fileName = '课件.pdf';

            if (contentDisposition && contentDisposition.includes('filename=')) {
                fileName = contentDisposition.split('filename=')[1].replace(/"/g, '');
            } else {
                // 从URL中提取文件名
                const urlFileName = downloadUrl.split('/').pop();
                if (urlFileName) {
                    fileName = urlFileName;
                }
            }

            // 处理文件下载
            const blob = await response.blob();
            const link = document.createElement('a');
            link.href = URL.createObjectURL(blob);
            link.download = fileName; // 使用实际文件名
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);

            console.log('文件下载成功');
        } catch (error) {
            console.error('下载过程出错:', error);
            alert('下载失败: ' + error.message);
        }
        // 隐藏遮罩层
        hideLoadingOverlay();
    }

    // 显示遮罩层
    function showLoadingOverlay() {
        const overlay = document.createElement('div');
        overlay.id = 'loading-overlay';
        overlay.style.position = 'fixed';
        overlay.style.top = '0';
        overlay.style.left = '0';
        overlay.style.width = '100%';
        overlay.style.height = '100%';
        overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';
        overlay.style.color = 'white';
        overlay.style.display = 'flex';
        overlay.style.alignItems = 'center';
        overlay.style.justifyContent = 'center';
        overlay.style.fontSize = '20px';
        overlay.innerText = '正在下载课件，请稍候...';
        overlay.style.zIndex = '9999'; // 设置 z-index 确保在最上层
        document.body.appendChild(overlay);
        return overlay;
    }

    // 隐藏遮罩层
    function hideLoadingOverlay() {
        const overlay = document.getElementById('loading-overlay');
        if (overlay) {
            document.body.removeChild(overlay);
        }
    }

})();